package com.xiao.dynamic_rule.service;


import com.xiao.dynamic_rule.pojo.RuleParam;
import com.xiao.dynamic_rule.utils.HbaseUtils;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Table;

import java.io.IOException;
import java.util.HashMap;
import java.util.Set;

/**
 * 用户画像查询服务，Hbase查询实现类
 */
public class UserProfileQueryServiceHbaseImpl implements UserProfileQueryService {

    Table user_profile;
    /**
     * 在构造方法中连接hbase，只要创建对象就会连接上hbase
     * @throws IOException
     */
    public UserProfileQueryServiceHbaseImpl() throws IOException {
        Connection connection = HbaseUtils.HbaseConnect("hadoop101:2181,hadoop102:2181,hadoop103:2181");
        user_profile = connection.getTable(TableName.valueOf("user_profile"));
    }

    /**
     * 传入用户id和规则条件对象，返回是否符合
     * TODO 本查询只返回了成立不成立，而查询的画像数据并没有返回，后面对缓存不方便，后期需改造
     * @param deviceId
     * @param ruleParam
     * @return 此用户是否符合该规则条件
     */
    @Override
    public boolean judgeQueryProfileCondition(String deviceId, RuleParam ruleParam){

        HashMap<String, String> userProfileParams = ruleParam.getUserProfileParams();

        //取出传入的条件对象中需要查询的标签名
        Set<String> tagNames = userProfileParams.keySet();

        //new一个get传入行键
        Get get = new Get(deviceId.getBytes());

        for (String tagName : tagNames) {
            //将所有的标签名添加到get中
            get.addColumn("f".getBytes(),tagName.getBytes());
        }

        //查询hbase
        try {
            Result result = user_profile.get(get);
            //将对应 key的值拿出来
            for (String tagName : tagNames) {
                String value = new String(result.getValue("f".getBytes(), tagName.getBytes()));
                //和给到的条件中的标签值比较
                String ruleValue = userProfileParams.get(tagName);

                if (!(ruleValue.equals(value))){
                    return false;
                }
            }
            return false;
        } catch (IOException e) {
            e.printStackTrace();
        }
        //如果程序能走到这里的话，说明程序报错了，直接返回false
        return false;
    }
}
